﻿using Ionic.Zip;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Worktool.CODE_Chris.Forms.Update;
using Worktool.CODE_Chris.SQL_DATA;

namespace Worktool.CODE_Chris.Version
{
    public partial class Version : Form
    {
        private SQL sql;

        public Version()
        {
            InitializeComponent();
            init();
        }

        private void init()
        {
            if (Login.user == "" || Login.user != "Nowottny, Christopher") groupBoxAdmin.Enabled = false;

            sql = new SQL();

            groupBoxVersion.Text = "Tool Version (" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + ")";

            labelMajor.Text = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Major.ToString();
            labelMinor.Text = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Minor.ToString();
            labelBuild.Text = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Build.ToString();
            labelRevision.Text = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision.ToString();

            labelDate.Text = "Version erstellt am " + retrieveLinkerTimestamp().ToShortDateString() + " um " + retrieveLinkerTimestamp().ToShortTimeString() + " Uhr.";

            checkUpdate();
        }

        private void checkUpdate()
        {
            try
            {
                sql.setConnectionString(Login.connectionMASTER);
                String[,] versions = sql.receiveSQL("SELECT MAX(VersionDate) AS Version FROM WORKTOOL_Versions");

                DateTime newVersion = DateTime.Parse(versions[0, 0]);

                if ((sql.retrieveLinkerTimestamp() - newVersion).Seconds < 0)
                {
                    //Version ist älter als die auf dem Server
                    String[,] newTool = sql.receiveSQL("SELECT Version FROM WORKTOOL_Versions WHERE VersionDate = (SELECT MAX(VersionDate) AS Version FROM WORKTOOL_Versions)");
                    labelNewVersion.Text = labelNewVersion.Text + " " + newTool[0, 0];
                    labelNewVersion.Visible = true;
                    labelAktuell.Visible = false;
                }
                else if ((sql.retrieveLinkerTimestamp() - newVersion).Seconds > 0)
                {
                    //Version ist neuer als Version auf dem Server...

                } else
                {
                    //Version ist aktuell...

                }

                sql.setConnectionString(Login.connection);
            }
            catch (Exception e)
            {
                sql.log("FEHLER", e, this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name);
            }

        }


        private DateTime retrieveLinkerTimestamp()
        {
            string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
            const int c_PeHeaderOffset = 60;
            const int c_LinkerTimestampOffset = 8;
            byte[] b = new byte[2048];
            System.IO.Stream s = null;

            try
            {
                s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
                s.Read(b, 0, 2048);
            }
            finally
            {
                if (s != null)
                {
                    s.Close();
                }
            }

            int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
            int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
            DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
            dt = dt.AddSeconds(secondsSince1970);
            dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
            return dt;
        }

        private void buttonOk_Click_1(object sender, EventArgs e)
        {
            this.Close();
        }

        private void buttonCreateVersionFile_Click(object sender, EventArgs e)
        {
            try
            {
                String desktop = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                String directory = desktop + "\\ASC_WorktoolToFTP_" + DateTime.Now.ToString("dd/MM/yyyy").Replace(".", "") + "\\";
                String textFile = directory + SearchForUpdates.versionFileName;
                String zipFile = directory + DateTime.Now.ToString("dd/MM/yyyy").Replace(".", "") + "_" + SearchForUpdates.versionNr + ".zip";

                //Verzeichnis löschen wenn es existiert und dann neu erstellen
                if (Directory.Exists(directory)) Directory.Delete(directory, true);
                Directory.CreateDirectory(directory);

                //Textfile erstellen
                //using (StreamWriter sw = File.CreateText(textFile))
                //{
                //    sw.WriteLine("app|version|release date|url|file");
                //    sw.WriteLine("Materialverwaltung|" + SearchForUpdates.versionNr + "|" + DateTime.Now.ToString("dd/MM/yyyy").Replace(".", "/") + "|" + SearchForUpdates.downloadUrl + "|" + DateTime.Now.ToString("dd/MM/yyyy").Replace(".", "") + "_" + SearchForUpdates.versionNr + ".zip");
                //}

                //ZIP-Datei mit Mitgliederverwaltung.exe erstellen
                using (ZipFile mv = new ZipFile())
                {
                    mv.AddFile(Login.dictSettings["apppath"] + "Worktool.exe", "");
                    mv.Save(zipFile);
                }

                MessageBox.Show("Ordner \"ASC_WorktoolToFTP_" + DateTime.Now.ToString("dd/MM/yyyy").Replace(".", "") + "\" mit den hochzuladenden Dateien auf dem Desktop erstellt.\r\n\r\nIn der ZIP-Datei ist die aktuelle \"ASC.exe\" Datei enthalten.\r\n\r\nSollten weitere Änderungen vorgenommen worden sein, bitte die veränderten Dateien ebenfalls in die ZIP-Datei kopieren und die Ordnerstruktur dabei berücksichtigen.\r\n\r\nDie Dateien dieses Ordners bitte auf den FTP-Server in \"C:\\DATEN\\FTP\\Amptown_TOOL_UPDATE\\Materialverwaltung\" hochladen und dabei die Datei \"" + SearchForUpdates.versionFileName + "\" ersetzen.", "Info");

                //if (MessageBox.Show("Diese Version in der ASC-Datenbank (lokal) registrieren?", "Version registrieren", MessageBoxButtons.YesNo) == DialogResult.Yes)
                //{
                //    int errorLokal = 0, errorPaulinchen = 0;
                //    try
                //    {
                //        //Lokal
                //        sql.setConnectionString(GUI.dictSettings["connectionStringMASTER"]);
                //        sql.sendSQL("INSERT INTO TOOL_Versions VALUES('" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + "','" + sql.retrieveLinkerTimestamp().ToString() + "')");
                //        sql.setConnectionString(GUI.dictSettings["connectionString"]);
                //    }
                //    catch (Exception)
                //    {
                //        errorLokal++;
                //    }
                //    try
                //    {
                //        //Amptown (ToDo: Dazu muss erstmal der Port nach aussen geöffnet werden)
                //        //sql.setConnectionString(GUI.dictSettings["connectionStringPaulinchen"]);
                //        //sql.sendSQL("INSERT INTO TOOL_Versions VALUES('" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + "','" + sql.retrieveLinkerTimestamp().ToString() + "')");
                //        //sql.setConnectionString(GUI.dictSettings["connectionString"]);
                //    }
                //    catch (Exception)
                //    {
                //        errorPaulinchen++;
                //    }
                //    if (errorLokal > 0)
                //    {
                //        MessageBox.Show("Registrieren in der lokalen Datenbank fehlgeschlagen (siehe Log-Datei).", "Fehler");
                //    }
                //    if (errorPaulinchen > 0)
                //    {
                //        MessageBox.Show("Registrieren in der ASC Datenbank fehlgeschlagen (siehe Log-Datei).", "Fehler");
                //    }
                //    if (errorPaulinchen == 0 && errorLokal == 0)
                //    {
                //        MessageBox.Show("Neue Version auf beiden Servern erfolgreich registriert.", "Info");
                //    }
                //}
            }
            catch (Exception ex)
            {
                sql.log("FEHLER", ex, this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name);
            }
        }

        private void buttonShowState_Click(object sender, EventArgs e)
        {

        }
    }
}
